﻿package com.firewolf.shiro.authentication.strategy;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.pam.AbstractAuthenticationStrategy;
import org.apache.shiro.realm.Realm;

/**
 * @Description: 自定义策略,只允许有一个Realm验证通过，可以有多个Realm来认证，但是只能有一个通过，
 * @Author: 刘兴
 * @Date : 2016年7月21日
 * @package : com.firewolf.shiro.authenticationstrategy.strategy
 * @Java_Version : 1.7
 * @Version : 2016年7月21日上午8:07:24
 */
public class OnlyOneAuthenticatorStrategy extends AbstractAuthenticationStrategy {

	@Override
	public AuthenticationInfo afterAttempt(Realm realm, AuthenticationToken token, AuthenticationInfo singleRealmInfo,
			AuthenticationInfo aggregateInfo, Throwable t) throws AuthenticationException {
		AuthenticationInfo info;
		if (singleRealmInfo == null) {
			info = aggregateInfo;
		} else {
			if (aggregateInfo == null) {
				info = singleRealmInfo;
			} else {
				info = merge(singleRealmInfo, aggregateInfo);
				if (info.getPrincipals().getRealmNames().size() > 1) {
					System.out.println(info.getPrincipals().getRealmNames());
					throw new AuthenticationException("Authentication token of type [" + token.getClass() + "] "
							+ " 不要配置多个可以认证通过的Realm，请保证只有一个可以认证通过！");
				}
			}
		}
		return info;
	}

}
